//
// Created by Administrator on 2025/8/20.
//

#include "sensor_manager.h"
#include "sqlist.h"
#include "printf_rtos.h"
// 全局的传感器注册表
SeqList_t g_sensor_registry;


// 初始化注册表
void sensor_registry_init(void) {
    // 使用你定义的 sensor_config_t 结构体大小来初始化列表
    if (SeqList_Init(&g_sensor_registry, sizeof(sensor_config_t)) != pdPASS) {
        printf_rtos("Failed to initialize sensor registry!\n");
        // 处理错误
    }

    // 在这里，你可以从Flash/EEPROM加载已保存的配置，并填充到g_sensor_registry中
    // load_sensors_from_flash();
}

/**
 * @brief 根据ID查找传感器配置，并将找到的配置复制到 out_sensor 中
 * @param id 要查找的传感器ID
 * @param out_sensor 指向一个 sensor_config_t 结构体的指针，用于接收找到的数据
 * @return pdPASS 表示查找成功，pdFAIL 表示未找到
 */
BaseType_t find_sensor_by_id_and_copy(const char* id, sensor_config_t* out_sensor)
{
    if (id == NULL || out_sensor == NULL) {
        return pdFAIL;
    }

    for (uint32_t i = 0; i < g_sensor_registry.size; i++) {
        // 在栈上创建一个临时的 sensor_config_t 实例来接收数据
        sensor_config_t temp_sensor;

        // 调用 SeqList_Get 将列表中的元素复制到 temp_sensor 中
        if (SeqList_Get(&g_sensor_registry, i, &temp_sensor) == pdPASS) {
            // 比较ID是否匹配
            if (temp_sensor.id != NULL && strcmp(temp_sensor.id, id) == 0) {
                // 匹配成功，将数据复制到输出参数 out_sensor 中
                memcpy(out_sensor, &temp_sensor, sizeof(sensor_config_t));
                return pdPASS; // 成功找到，返回
            }
        }
    }

    return pdFAIL; // 遍历完列表也未找到
}

// 读取内部温度的函数
BaseType_t read_internal_temp(void *context, sensor_value_t *value) {
    extern float internal_temp_celsius; // 假设这个变量在别处更新
    value->val_float = internal_temp_celsius;
    return pdPASS;
}

// 读取LED状态的函数
BaseType_t read_led_state(void *context, sensor_value_t *value) {
    GPIO_TypeDef* GPIOx = (GPIO_TypeDef*)context;
    sensor_config_t temp;
    find_sensor_by_id_and_copy("m_led",&temp);
    uint16_t GPIO_Pin = (uint16_t)(uint32_t)temp.context_pin; // 从配置中获取引脚
    value->val_int = !HAL_GPIO_ReadPin(GPIOx, GPIO_Pin); // 读取引脚状态
    return pdPASS;
}

// 写入/控制LED状态的函数
BaseType_t write_led_state(void *context, const sensor_value_t *value) {
    GPIO_TypeDef* GPIOx = (GPIO_TypeDef*)context;
    sensor_config_t temp;
    find_sensor_by_id_and_copy("m_led",&temp);
    uint16_t GPIO_Pin = (uint16_t)(uint32_t)temp.context_pin; // 从配置中获取引脚
    HAL_GPIO_WritePin(GPIOx, GPIO_Pin, !value->val_int); // 根据传入的值控制引脚
    return pdPASS;
}